import functools
import grpc
from api.grpc.interceptor.exception_interceptor import gRPCException, ValidationException, NotFoundException

def grpc_exception_handler(func):
    """gRPC方法异常处理装饰器
    
    使用此装饰器后，业务代码无需处理异常，异常会被自动捕获并转换为合适的gRPC状态码
    """
    @functools.wraps(func)
    def wrapper(self, request, context):
        try:
            return func(self, request, context)
        except gRPCException as e:
            # 处理自定义gRPC异常
            context.set_code(e.code)
            context.set_details(e.message)
            return func.__annotations__.get('return', None)()
        except ValueError as e:
            # 处理值错误（通常是参数验证失败）
            context.set_code(grpc.StatusCode.INVALID_ARGUMENT)
            context.set_details(str(e))
            return func.__annotations__.get('return', None)()
        except KeyError as e:
            # 处理键错误（通常是资源未找到）
            context.set_code(grpc.StatusCode.NOT_FOUND)
            context.set_details(f"资源未找到: {str(e)}")
            return func.__annotations__.get('return', None)()
        except Exception as e:
            # 处理所有其他异常
            context.set_code(grpc.StatusCode.INTERNAL)
            context.set_details("服务器内部错误")
            return func.__annotations__.get('return', None)()
    return wrapper

def validate_request(validator_func):
    """请求验证装饰器
    
    在执行业务逻辑前进行参数验证
    """
    def decorator(func):
        @functools.wraps(func)
        def wrapper(self, request, context):
            try:
                validator_func(request)
            except ValueError as e:
                context.set_code(grpc.StatusCode.INVALID_ARGUMENT)
                context.set_details(str(e))
                return func.__annotations__.get('return', None)()
            return func(self, request, context)
        return wrapper
    return decorator